/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.kiakaku.downloadpage;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.jgrapht.Graph;
import org.jgrapht.graph.DefaultEdge;
import org.jgrapht.graph.SimpleDirectedGraph;
import org.kiakaku.utility.FileUtility;

/*
 *   File HePhuongTrinhTuyenTinh is created by kiakaku on Mar 15, 2012 10:26:26 PM
 * If you want modify this file please insert information in here 
 * - Last modify in Mar 15, 2012, 10:26:26 PM by kiakaku
 *                  
 *
 * @author kiakaku
 */
public class HePhuongTrinhTuyenTinh {

    String sourceFile;
    String targetFile;
    public static final String NAME_NODE_DAT = "Node đất";
    SimpleDirectedGraph graph;
    int sizeofGraph;

    public HePhuongTrinhTuyenTinh(String sourceFile, String targetFile) {
        this.sourceFile = sourceFile;
        this.targetFile = targetFile;
        sizeofGraph = 0;
    }

    /*
     * Đọc đồ thị từ file vào rồi xây dựng lại đồ thị sau đó add thêm node nối đất vào đồ thì
     * Tất cả các node trong đồ thị được nối với node đất
     */
    public void reBuildGraph() {
        SimpleDirectedGraph graph = new SimpleDirectedGraph<Node, DefaultEdge>(DefaultEdge.class);
        List<Node> source = null;
        List<Node> target = null;
        source = new ArrayList<Node>(FileUtility.docListOne(sourceFile));
        target = new ArrayList<Node>(FileUtility.docListOne(targetFile));
        Node tar_node = null;
        Node sou_node = null;

        for (int i = 0; i < source.size(); i++) {
            tar_node = target.get(i);
            sou_node = source.get(i);
            graph.addVertex(sou_node);
            graph.addVertex(tar_node);
            graph.addEdge(sou_node, tar_node);
        }
        List<Node> all = new ArrayList<Node>(graph.vertexSet());
        sizeofGraph = all.size() + 1; // do phải thêm node nối đất nên +1
        Node nodeDat = new Node(NAME_NODE_DAT, -1, -1);
        // thêm node nối đất cho đồ thị
        graph.addVertex(nodeDat);
        // Thêm cạnh từ mỗi node của đồ thị tới node đất
        for (Node a : all) {
            graph.addEdge(a, nodeDat);
        }
    }

    /*
     * Thành lập hệ phương trình từ đồ thị bằng cách duyệt theo chiều sâu
     * Hệ phương trình được lưu thành một mảng các danh sách liên kết (linkedList)
     * Lưu trữ dang v1 = a12*v2 + a19*v9 ...
     *              v2 = a25*v5 + a29*v9 + a2100*v100 ...
     *              ......
     *              v5000 = a5001*v1 + ....
     */
    public void thanhLapHePhuongTrinh() {
        LinkedList<NodeHePhuongTrinh>[] lists = (LinkedList<NodeHePhuongTrinh>[]) new LinkedList[sizeofGraph];
    }

    public Node duyetTheoChieuSau(SimpleDirectedGraph<SimpleDirectedGraph, Node> g) {
        Node root = new Node("http://dantri.com.vn", 0, 0);
        return null;
    }
}
